import { core_viewmodel } from "../../core/viewModel/core_viewmodel";
import { container, ServiceIdentifiers } from "../../core/di";
import type { GameApplication } from "../GameApplication";
import type { SceneCoordinator } from "../coordinator/SceneCoordinator";

/**
 * Game ViewModel
 * 
 * 职责：
 * 1. 管理 UI 相关的响应式数据
 * 2. 提供命令供 View 调用
 * 3. 通过场景协调器与 ECS 交互
 * 
 * 注意：不再直接管理 ECS 生命周期，由 GameApplication 负责
 */
export class gameVM extends core_viewmodel {
    /**
     * 获取 GameApplication 实例
     */
    private getGameApp(): GameApplication {
        return container.resolve<GameApplication>(ServiceIdentifiers.GameApplication);
    }
    
    /**
     * 获取 SceneCoordinator 实例
     */
    private getSceneCoordinator(): SceneCoordinator {
        return container.resolve<SceneCoordinator>(ServiceIdentifiers.SceneCoordinator);
    }
    
    /**
     * 初始化数据
     */
    protected initializeData(): void {
        // 定义响应式数据
        this.setData('score', 0);
        this.setData('level', 1);
        this.setData('isPaused', false);
        this.setData('gameTime', 0);
        this.setData('fps', 0);
    }
    
    /**
     * 初始化计算属性
     */
    protected initializeComputed(): void {
        // 示例：计算属性
        this.addComputed('formattedGameTime', () => {
            const time = this.getData<number>('gameTime');
            const minutes = Math.floor(time / 60);
            const seconds = Math.floor(time % 60);
            return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
        });
    }
    
    /**
     * 初始化命令
     */
    protected initializeCommands(): void {
        // 暂停游戏
        this.addCommand('pause', () => {
            this.getGameApp().pause();
            this.setData('isPaused', true);
            console.log('[GameVM] 游戏暂停');
        });
        
        // 恢复游戏
        this.addCommand('resume', () => {
            this.getGameApp().resume();
            this.setData('isPaused', false);
            console.log('[GameVM] 游戏恢复');
        });
        
        // 重启游戏
        this.addCommand('restart', async () => {
            await this.getGameApp().restart();
            this.setData('score', 0);
            this.setData('level', 1);
            this.setData('gameTime', 0);
            console.log('[GameVM] 游戏重启');
        });
        
        // 打印统计信息
        this.addCommand('printStats', () => {
            this.getGameApp().printStatistics();
        });
        
        // 创建游戏实体（示例）
        this.addCommand('createEntity', async (prefabPath: string) => {
            const node = await this.getSceneCoordinator().instantiatePrefab(
                'game',
                prefabPath,
                { layerName: 'game' }
            );
            
            if (node) {
                console.log('[GameVM] 创建实体成功:', node.name);
                // 可以创建对应的 ECS 实体并绑定节点
            }
        });
    }
    
    /**
     * ViewModel 初始化时的回调
     */
    onInitialize(): void {
        console.log('[GameVM] ✅ ViewModel 初始化完成');
        
        // 可以在这里订阅游戏事件
        // 可以初始化 UI 数据
        // 但不应该初始化 ECS（由 GameApplication 管理）
    }
    
    /**
     * 更新游戏时间（可以在 View 的 update 中调用）
     */
    public updateGameTime(dt: number): void {
        if (!this.getGameApp().isPaused()) {
            const currentTime = this.getData<number>('gameTime');
            this.setData('gameTime', currentTime + dt);
        }
    }
    
    /**
     * 更新 FPS 显示
     */
    public updateFPS(): void {
        const fps = Math.round(this.getGameApp().getAverageFPS());
        this.setData('fps', fps);
    }
    
    /**
     * 增加分数
     */
    public addScore(points: number): void {
        const currentScore = this.getData<number>('score');
        this.setData('score', currentScore + points);
    }
    
    /**
     * 升级
     */
    public levelUp(): void {
        const currentLevel = this.getData<number>('level');
        this.setData('level', currentLevel + 1);
    }
    
    /**
     * 获取游戏是否暂停
     */
    public isPaused(): boolean {
        return this.getData<boolean>('isPaused');
    }
    
    /**
     * 销毁前的回调
     */
    protected onDestroy(): void {
        console.log('[GameVM] 销毁');
    }
}


